package cxy.highConcurrency;

import java.util.concurrent.atomic.AtomicLong;

/**
 * 一个线程前后两次调用 ThreadId 的 get() 方法，两次 get() 方法的返回值是相同的。
 * 但如果是两个线程分别调用 ThreadId 的 get() 方法，那么两个线程看到的 get() 方法的返回值是不同的。
 * @author admin
 *
 */
public class ThreadLocalDemo {
	
	final AtomicLong nextId = new AtomicLong(0);
	// 定义ThreadLocal变量  final
	ThreadLocal<Long> tl = ThreadLocal.withInitial(() -> nextId.getAndIncrement());

	// 此方法会为每个线程分配一个唯一的Id
	long get() {
		return tl.get();
	}
	
	public static void main(String[] args) {
		ThreadLocalDemo threadLocalDemo = new ThreadLocalDemo();
		System.out.println(threadLocalDemo.get());
		
		new Thread(() ->  {
			System.out.println(threadLocalDemo.get());
		}).start();
		
		new Thread(() ->  {
			System.out.println(threadLocalDemo.get());
		}).start();
		
	}
}
